package cn.yedong.system.service.impl;

import cn.yedong.basic.query.BaseQuery;
import cn.yedong.basic.util.QueryResult;
import cn.yedong.system.domain.Role;
import cn.yedong.system.mapper.RoleMapper;
import cn.yedong.system.service.IRoleService;
import cn.yedong.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 业务实现类：
 */
@Service
public class RoleServiceImpl extends BaseServiceImpl<Role> implements IRoleService {
    @Autowired
    private RoleMapper roleMapper;
    /**
     * 添加
     * @param role
     */
    @Transactional
    @Override
    public void add(Role role) {
        //先添加角色-再添加菜单和权限【角色添加之后，才回产生自增id】
        super.add(role);
        //添加当前角色的菜单
        if(role.getMenuIds() != null && role.getMenuIds().size() > 0){
            roleMapper.addRoleMenus(role.getId(),role.getMenuIds());
        }
        //添加当前角色的权限
        if(role.getPermissionIds() != null && role.getPermissionIds().size() > 0){
            roleMapper.addRolePermissions(role.getId(),role.getPermissionIds());
        }
    }

    /**
     * 删除
     * @param id
     */
    @Transactional
    @Override
    public void del(Long id) {
        //删除主表之前先删除中间表
        //删除当前角色菜单
        roleMapper.delMenusByRoleId(id);
        //删除当前角色权限
        roleMapper.delPermissionsByRoleId(id);
        //删除当前角色和员工中间表
        roleMapper.delEmployeeRoleByRoleId(id);
        //删除角色
        super.del(id);
    }

    /**
     * 修改
     * @param role
     */
    @Transactional
    @Override
    public void update(Role role) {
        //【先删除中间表，再添加中间表】删除主表之前先删除中间表
        //删除当前角色菜单
        roleMapper.delMenusByRoleId(role.getId());
        //删除当前角色权限
        roleMapper.delPermissionsByRoleId(role.getId());

        //添加当前角色的菜单
        if(role.getMenuIds() != null && role.getMenuIds().size() > 0){
            roleMapper.addRoleMenus(role.getId(),role.getMenuIds());
        }
        //添加当前角色的权限
        if(role.getPermissionIds() != null && role.getPermissionIds().size() > 0){
            roleMapper.addRolePermissions(role.getId(),role.getPermissionIds());
        }

        
        super.update(role);
    }

    /**
     * 批量删除
     * @param ids
     */
    @Transactional
    @Override
    public void patchDel(List<Long> ids) {
        for (Long id : ids) {
            //直接调当前删除方法
            this.del(id);
        }
    }

    /**
     * 重写分页数据方法，查询权限id添加进其permissionIds
     * @param baseQuery
     * @return
     */
    @Override
    public QueryResult<Role> pageQuery(BaseQuery baseQuery) {
        //分页查询结果集【总页数+当前分页数据】
        QueryResult<Role> roleQueryResult = super.pageQuery(baseQuery);
        //获取当前分页数据
        List<Role> data = roleQueryResult.getData();
        //遍历当前分页数据集合
        for (Role role : data) {
            //通过每一条数据roleId查询permissionIds集合
            List<Long> Ids= roleMapper.findPermissionIdsByRoleId(role.getId());
            //将permissionIds装到当前对象permissionIds
            role.setPermissionIds(Ids);
        }
        //返回操作后的分页数据
        return roleQueryResult;
    }
}
